
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>【Prometheus】 Grafana数据与可视化</title>
            </head>
            <body>
            <a href="https://andyoung.blog.csdn.net">原作者博客</a>
            <div id="content_views" class="markdown_views prism-atom-one-light">
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <p>“You can’t fix what you can’t see”。可视化是监控的核心目标之一，在本章中我们将介绍Prometheus下的可视化技术。例如，Prometheus自身提供的Console Template能力以及Grafana这一可视化工具实现监控数据可视化。Prometheus UI提供了基本的数据可视化能力，可以帮助用户直接使用PromQL查询数据，并将数据通过可视化图表的方式进行展示，而实际的应用场景中往往不同的人对于可视化的需求不一样，关注的指标也不一样，因此我们需要能够有能力，构建出不同的可视化报表页面。 本章学习的内容就主要解决以上问题。</p> 
<h2><a id="Grafana_2"></a><strong>Grafana的基本概念</strong></h2> 
<p>在<a href="https://andyoung.blog.csdn.net/article/details/122040410" rel="nofollow">[【Prometheus】 Prometheus 入门到实战搭建监控系统]</a>中我们已经尝试通过Grafana快速搭建过一个主机监控的Dashboard，在本章中将会带来读者学习如何使用Grafana创建更加精美的可视化报表。</p> 
<p>首先Grafana是一个通用的可视化工具。‘通用’意味着Grafana不仅仅适用于展示Prometheus下的监控数据，也同样适用于一些其他的数据可视化需求。在开始使用Grafana之前，我们首先需要明确一些Grafana下的基本概念，以帮助用户能够快速理解Grafana。</p> 
<h3><a id="Data_Source_8"></a>数据源（Data Source）</h3> 
<p>对于Grafana而言，Prometheus这类为其提供数据的对象均称为数据源（Data Source）。目前，Grafana官方提供了对：Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch, CloudWatch的支持。对于Grafana管理员而言，只需要将这些对象以数据源的形式添加到Grafana中，Grafana便可以轻松的实现对这些数据的可视化工作。</p> 
<h3><a id="Dashboard_12"></a>仪表盘（Dashboard）</h3> 
<p>通过数据源定义好可视化的数据来源之后，对于用户而言最重要的事情就是实现数据的可视化。在Grafana中，我们通过Dashboard来组织和管理我们的数据可视化图表：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/99b7ed813cb01ff09195ed14b3808a52.png" alt="Grafana Dashboard"></p> 
<p>如上所示，在一个Dashboard中一个最基本的可视化单元为一个<strong>Panel（面板）</strong>，Panel通过如趋势图，热力图的形式展示可视化数据。 并且在Dashboard中每一个Panel是一个完全独立的部分，通过Panel的**Query Editor（查询编辑器）**我们可以为每一个Panel自己查询的数据源以及数据查询方式，例如，如果以Prometheus作为数据源，那在Query Editor中，我们实际上使用的是PromQL，而Panel则会负责从特定的Prometheus中查询出相应的数据，并且将其可视化。由于每个Panel是完全独立的，因此在一个Dashboard中，往往可能会包含来自多个Data Source的数据。</p> 
<p>Grafana通过插件的形式提供了多种Panel的实现，常用的如：Graph Panel，Heatmap Panel，SingleStat Panel以及Table Panel等。用户还可通过插件安装更多类型的Panel面板。</p> 
<p>除了Panel以外，在Dashboard页面中，我们还可以定义一个<strong>Row（行）</strong>，来组织和管理一组相关的Panel。</p> 
<p>除了Panel, Row这些对象以外，Grafana还允许用户为Dashboard定义<strong>Templating variables（模板参数）</strong>，从而实现可以与用户动态交互的Dashboard页面。同时Grafana通过JSON数据结构管理了整个Dasboard的定义，因此这些Dashboard也是非常方便进行共享的。Grafana还专门为Dashboard提供了一个共享服务：https://grafana.com/dashboards，通过该服务用户可以轻松实现Dashboard的共享，同时我们也能快速的从中找到我们希望的Dashboard实现，并导入到自己的Grafana中。</p> 
<h3><a id="_29"></a>组织和用户</h3> 
<p>作为一个通用可视化工具，Grafana除了提供灵活的可视化定制能力以外，还提供了面向企业的组织级管理能力。在Grafana中Dashboard是属于一个<strong>Organization（组织）</strong>，通过Organization，可以在更大规模上使用Grafana，例如对于一个企业而言，我们可以创建多个Organization，其中**User（用户）**可以属于一个或多个不同的Organization。 并且在不同的Organization下，可以为User赋予不同的权限。 从而可以有效的根据企业的组织架构定义整个管理模型。</p> 
<h2><a id="Grafana_33"></a><strong>Grafana与数据可视化</strong></h2> 
<p>对于Grafana而言，Prometheus就是一个用于存储监控样本数据的数据源（Data Source）通过使用PromQL查询特定Prometheus实例中的数据并且在Panel中实现可视化。</p> 
<p>接下来，我们将带领读者了解如何通过Panel创建精美的可视化图表。</p> 
<h3><a id="Panel_39"></a>认识面板（Panel）</h3> 
<p>Panel是Grafana中最基本的可视化单元。每一种类型的面板都提供了相应的查询编辑器(Query Editor)，让用户可以从不同的数据源（如Prometheus）中查询出相应的监控数据，并且以可视化的方式展现。</p> 
<p>Grafana中所有的面板均以插件的形式进行使用，当前内置了5种类型的面板，分别是：<code>Graph</code>，<code>Singlestat</code>，<code>Heatmap</code>, <code>Dashlist</code>，<code>Table</code>以及<code>Text</code>。</p> 
<p>其中像Graph这样的面板允许用户可视化任意多个监控指标以及多条时间序列。而Siglestat则必须要求查询结果为单个样本。Dashlist和Text相对比较特殊，它们与特定的数据源无关。</p> 
<p>通过Grafana UI用户可以在一个Dashboard下添加Panel，点击Dashboard右上角的“Add Panel”按钮，如下所示，将会显示当前系统中所有可使用的Panel类型：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/4def51f8b9054f574a1df4259c812fd0.png" alt="添加Panel"></p> 
<p>选择想要创建的面板类型即可。这里以Graph面板为例，创建Panel之后，并切换到编辑模式，就可以进入Panel的配置页面。对于一个Panel而言，一般来说会包含2个主要的配置选项：General（通用设置）、Metrics（度量指标）。其余的配置则根据Panel类型的不同而不同。</p> 
<p>在通用设置中，除了一些Panel的基本信息以外，最主要的能力就是定义动态Panel的能力，这部分内容会在本章的“模板化Dashboard”小结中详细介绍。</p> 
<p>对于使用Prometheus作为数据源的用户，最主要的需要了解的就是Metrics设置的使用。在Metric选项中可以定义了Grafana从哪些数据源中查询样本数据。<strong>Data Source</strong>中指定当前查询的数据源，Grafana会加载当前组织中添加的所有数据源。其中还会包含两个特殊的数据源：<strong>Mixed</strong>和<strong>Grafana</strong>。 Mixed用于需要从多个数据源中查询和渲染数据的场景，Grafana则用于需要查询Grafana自身状态时使用。</p> 
<p>当选中数据源时，Panel会根据当前数据源类型加载不同的Query Editor界面。这里我们主要介绍Prometheus Query Editor，如下所示，当选中的数据源类型为Prometheus时，会显示如下界面：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/7a6a59bd9bcb892ca430b9f99718f7dd.png" alt="Query Editor"></p> 
<p>Grafana提供了对PromQL的完整支持，在Query Editor中，可以添加任意个Query，并且使用PromQL表达式从Prometheus中查询相应的样本数据。</p> 
<p>参看node_export cpu使用率</p> 
<pre><code>sum by(instance) (avg without(cpu) (irate(node_cpu_seconds_total{mode!="idle"}[5m]))) 
</code></pre> 
<p>每个PromQL表达式都可能返回多条时间序列。<strong>Legend format</strong>用于控制如何格式化每条时间序列的图例信息。Grafana支持通过模板的方式，根据时间序列的标签动态生成图例名称，例如：使用表示使用当前时间序列中的instance标签的值作为图例名称：</p> 
<p><code>{<!-- -->{instance}}-{<!-- -->{mode}}</code></p> 
<p>当查询到的样本数据量非常大时可以导致Grafana渲染图标时出现一些性能问题，通过<strong>Min Step</strong>可以控制Prometheus查询数据时的最小步长（Step），从而减少从Prometheus返回的数据量。</p> 
<p><strong>Resolution</strong>选项，则可以控制Grafana自身渲染的数据量。例如，如果<strong>Resolution</strong>的值为<strong>1/10</strong>，Grafana会将Prometeus返回的10个样本数据合并成一个点。因此<strong>Resolution</strong>越小可视化的精确性越高，反之，可视化的精度越低。</p> 
<p><strong>Format as</strong>选项定义如何格式化Prometheus返回的样本数据。这里提供了3个选项：Table,Time Series和Heatmap，分别用于Tabel面板，Graph面板和Heatmap面板的数据可视化。</p> 
<p>除此以外，Query Editor还提供了调试相关的功能，点击<strong>Query Inspector</strong>可以展开相关的调试面板：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/71d24bc80735d9b11fd0b0d62bb48a7d.png" alt="调试面板"></p> 
<h2><a id="Graph_89"></a><strong>变化趋势：Graph面板</strong></h2> 
<p>在面板中，可以查看当前Prometheus返回的样本数据，用户也可以提供Mock数据渲染图像。</p> 
<p>Graph面板是最常用的一种可视化面板，其通过折线图或者柱状图的形式显示监控样本随时间而变化的趋势。Graph面板天生适用于Prometheus中Gauge和Counter类型监控指标的监控数据可视化。例如，当需要查看主机CPU、内存使用率的随时间变化的情况时，可以使用Graph面板。同时，Graph还可以非常方便的支持多个数据之间的对比。</p> 
<blockquote> 
 <p>PS: 现在已更名为 Time series</p> 
</blockquote> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/b6992ca4af6c0776bc8f8915b8fc66f5.png" alt="Graph面板"></p> 
<h3><a id="GraphPrometheus_99"></a>Graph面板与Prometheus</h3> 
<p>Graph面板通过折线图或者柱状图的形式，能够展示监控样本数据在一段时间内的变化趋势，因此其天生适合Prometheus中的Counter和Gauge类型的监控指标的可视化，对于Histogram类型的指标也可以支持，不过可视化效果不如Heatmap Panel来的直观。</p> 
<h3><a id="GraphCounterGauge_103"></a>使用Graph面板可视化Counter/Gauge</h3> 
<p>以主机为例，CPU使用率的变化趋势天然适用于使用Grapn面板来进行展示：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/cdfd5cc5c9f9b25f1a73669911a415e1.png" alt="Prometheus Counter可视化"></p> 
<p>在<strong>Metrics选项</strong>中，我们使用以下PromQL定义如何从Prometheus中读取数据：</p> 
<pre><code>sum by(instance) (avg without(cpu) (irate(node_cpu_seconds_total{mode!="idle"}[5m]))) 
</code></pre> 
<p>根据当前Prometheus的数据采集情况，该PromQL会返回多条时间序列（在示例中会返回3条）。Graph面板会从时间序列中获取样本数据，并绘制到图表中。 为了让折线图有更好的可读性，我们可以通过定义<strong>Legend format</strong>为<code>{<!-- -->{ instance }}</code>控制每条线的图例名称：</p> 
<p>由于当前使用的PromQL的数据范围为0~1表示CPU的使用率，为了能够更有效的表达出度量单位的概念，我们需要对Graph图表的坐标轴显示进行优化。如下所示，在<strong>Axes选项</strong>中可以控制图标的X轴和Y轴相关的行为：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/9795c6b369b3d9d5cdbe4e28b56ca709.png" alt="Axes选项"></p> 
<p>除了在Metrics设置图例的显示名称以外，在Graph面板的<strong>Legend选项</strong>可以进一步控制图例的显示方式，如下所示：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/ccb23e339551344496972c9a7c131f59.png" alt="Legend选项"></p> 
<p><strong>Thresholds</strong>，Threshold主要用于一些自定义一些样本的阈值，例如，定义一个Threshold规则，如果CPU超过50%的区域显示为warning状态，可以添加如下配置：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/dd9c8ed38e782a6ae1d5a698f433fca4.png" alt="Threshold设置"></p> 
<p>Graph面板则会在图表中显示一条阈值，并且将所有高于该阈值的区域显示为warining状态，通过可视化的方式直观的在图表中显示一些可能出现异常的区域。</p> 
<p>需要注意的是，如果用户为该图表自定义了Alert（告警）配置，Thresholds将会被警用，并且根据Alert中定义的Threshold在图形中显示阈值内容。关于Alert的使用会在后续部分，详细介绍。</p> 
<h3><a id="SingleStat_135"></a><strong>当前状态：SingleStat面板</strong></h3> 
<p>Singlem Panel侧重于展示系统的当前状态而非变化趋势。如下所示，在以下场景中特别适用于使用SingleStat：</p> 
<ul><li> <p>当前系统中所有服务的运行状态；</p> </li><li> <p>当前基础设施资源的使用量；</p> </li><li> <p>当前系统中某些事件发生的次数或者资源数量等。</p> </li><li> <p>当前系统中某些事件发生的次数或者资源数量等。</p> </li></ul> 
<p>如下所示，是使用SingleStat进行数据可视化的显示效果：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/369672ee70bb187acb7761334395264e.png" alt="SingleStat Panel示例"></p> 
<h4><a id="SingleStat_Panel_150"></a>使用SingleStat Panel</h4> 
<p>从Dashboardc创建Singlestat Panel，并进入编辑页面， 如下所示：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/439a10bb62694c347170ea3e9f85c19b.png" alt="SingleStat 编辑页面"></p> 
<p>对于SingleStat Panel而言，其只能处理一条时间序列，否则页面中会提示“Multiple Series Error”错误信息。这里使用如下PromQL查询当前主机负载：</p> 
<pre><code>node_load1{instance="localhost:9100"}
</code></pre> 
<p>默认情况下，当前面板中会显示当前时间序列中所有样本的平均值，而实际情况下，我们需要显示的是当前主机当前的负载情况，因此需要通过SingleStat Panel的<strong>Options</strong>选项控制当前面板的显示模式：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/12b3f7f5e568c671b76ce6a3d1fde4a0.png" alt="image-20220809140123156"></p> 
<p>如上所示，通过Value配置项组可以控制当前面板中显示的值，以及字体大小等。对于主机负载而言，我们希望能够显示当前的最新值，因此修改Calculation 为**Last * **即可。</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/4a70c7b68abd14d815e4806b9282fbea.png" alt="image-20220809140209141"></p> 
<p>如果希望面板能够根据不同的值显示不同的颜色的话，则可以定义<strong>Thresholds</strong>与<strong>Colors</strong>的映射关系，例如，定义Thresholds的分割区间值为“0,1”，则当Value的值落到不同的范围内时，将显示不同的颜色。</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/fd2c115a49224649637c3425867eda98.png" alt="image-20220809140417351"></p> 
<p>如果希望能够显示当前时间序列的样本值变化情况，则可以启用Spark lines配置。启用之后，Singlestat面板中除了会显示当前的最新样本值以外，也会同时将时间序列中的数据已趋势图的形式进行展示。</p> 
<p>除了通过数字大小反应当前状态以外，在某些场景下我们可能更关心的是这些数字表示的意义。例如，在Promthues监控服务的健康状态时，在样本数据中会通过0表示不健康，1表示健康。 但是如果直接将0或1显示在面板中，那么可视化效果将缺乏一定的可读性。</p> 
<p>为了提升数字的可读性，可以在Singlestat Panel中可以通过<strong>Value Mappings</strong>定义值的映射关系。Siglesta支持值映射（value to text）和区间映射（range to text）两种方式。 如下所示：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/ca3642079626cc2d7d72074b2dcf0ee2.png" alt="Singlestat value mappings配置"></p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/201a6488dbe2b5ef1a52b9385e5bb4e5.png" alt="image-20220809140804754"></p> 
<h2><a id="_186"></a>变量</h2> 
<p>在Grafana中用户可以为Dashboard定义一组变量（Variables），变量一般包含一个到多个可选值。如下所示，Grafana通过将变量渲染为一个下拉框选项，从而使用户可以动态的改变变量的值：</p> 
<p>例如，这里定义了一个名为node的变量，用户可以通过在PromQL表达式或者Panel的标题中通过以下形式使用该变量：</p> 
<pre><code>sum (avg without(cpu) (irate(node_cpu_seconds_total{mode!="idle",instance=~"$node"}[5m])))
</code></pre> 
<p>变量的值可以支持单选或者多选，当对接Prometheus时，Grafana会自动将$node的值格式化为如“<strong>host1|host2|host3</strong>”的形式。配合使用PromQL的标签正则匹配“<strong>=~</strong>”，通过动态改变PromQL从而实现基于标签快速对时间序列进行过滤。</p> 
<h4><a id="_200"></a>变量定义</h4> 
<p>通过Dashboard页面的Settings选项，可以进入Dashboard的配置页面并且选择Variables子菜单:</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/8ff1d0641a4dd59756a9887d15909349.png" alt="image-20220809142003367"></p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/b9279fdeac47dd4f69d4db1bbca73be3.png" alt="image-20220809141909671"></p> 
<p>用户需要指定变量的名称，后续用户就可以通过$variable_name的形式引用该变量。Grafana目前支持6种不同的变量类型，而能和Prometheus一起工作的主要包含以下5种类型：</p> 
<table><thead><tr><th>类型</th><th>工作方式</th></tr></thead><tbody><tr><td>Query</td><td>允许用户通过Datasource查询表达式的返回值动态生成变量的可选值</td></tr><tr><td>Interval</td><td>该变量代表时间跨度，通过Interval类型的变量，可以动态改变PromQL区间向量表达式中的时间范围。如rate(node_cpu[2m])</td></tr><tr><td>Datasource</td><td>允许用户动态切换当前Dashboard的数据源，特别适用于同一个Dashboard展示多个数据源数据的情况</td></tr><tr><td>Custom</td><td>用户直接通过手动的方式，定义变量的可选值</td></tr><tr><td>Constant</td><td>常量，在导入Dashboard时，会要求用户设置该常量的值</td></tr></tbody></table> 
<p>Label属性用于指定界面中变量的显示名称，Hide属性则用于指定在渲染界面时是否隐藏该变量的下拉框。</p> 
<h3><a id="_220"></a>使用变量过滤时间序列</h3> 
<p>当Prometheus同时采集了多个主机节点的监控样本数据时，用户希望能够手动选择并查看其中特定主机的监控数据。这时我们需要使用Query类型的变量。</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/97cc1f1bfe082be48e19fba39fe897c6.png" alt="image-20220809143405885"></p> 
<p>如上所示，这里我们为Dashboard创建了一个名为node的变量，并且指定其类型为Query。Query类型的变量，允许用户指定数据源以及查询表达式，并通过正则匹配（Regex）的方式对查询结果进行处理，从而动态生成变量的可选值。在这里指定了数据源为Prometheus，通过使用node_load1我们得到了三条时间序列：</p> 
<pre><code>node_load1{instance="193.168.0.183:9100",job="node"}
node_load1{instance="193.168.0.192:9100",job="node"}
node_load1{instance="193.168.0.30:9100",job="node"}
</code></pre> 
<p>通过指定正则匹配表达式为<code>/.*instance="([^"]*).*/</code>从而匹配出标签instance的值作为node变量的所有可选项，即：</p> 
<pre><code>193.168.0.183:9100
193.168.0.192:9100
193.168.0.30:9100
</code></pre> 
<p><strong>Selection Options</strong>选项中可以指定该变量的下拉框是否支持多选，以及是否包含全选（All）选项。</p> 
<p>保存变量后，用户可以在Panel的General或者Metrics中通过$node的方式使用该变量，如下所示：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/08889674bfa979214dc499a23abb14c1.png" alt="image-20220809143615959"></p> 
<h2><a id="_248"></a>报警</h2> 
<p>grafana 4 版本以上就支持了报警功能，这使得我们利用 grafana 作为监控面板更为完整，因为报警是监控系统中必不可少的环节，grafana 支持很多种形式的报警功能，比如 email、钉钉、slack、webhook 等等，我们这里来测试下 email 和 钉钉。</p> 
<h4><a id="email__252"></a>email 报警</h4> 
<p>要启用 email 报警需要在启动配置文件中<code>/etc/grafana/grafan.ini</code>开启 SMTP 服务，我们这里同样利用一个 ConfigMap 资源对象挂载到 grafana Pod 中：（grafana-cm.yaml）</p> 
<pre><code class="prism language-yaml"><span class="token key atrule">apiVersion</span><span class="token punctuation">:</span> v1
<span class="token key atrule">kind</span><span class="token punctuation">:</span> ConfigMap
<span class="token key atrule">metadata</span><span class="token punctuation">:</span>
  <span class="token key atrule">name</span><span class="token punctuation">:</span> grafana<span class="token punctuation">-</span>config
  <span class="token key atrule">namespace</span><span class="token punctuation">:</span> kube<span class="token punctuation">-</span>ops
<span class="token key atrule">data</span><span class="token punctuation">:</span>
  <span class="token key atrule">grafana.ini</span><span class="token punctuation">:</span> <span class="token punctuation">|</span><span class="token scalar string">
    [server]
    root_url = http://&lt;你grafana的url地址&gt;
    [smtp]
    enabled = true
    host = smtp.163.com:25
    user = ych_1024@163.com
    password = &lt;邮箱密码&gt;
    skip_verify = true
    from_address = ych_1024@163.com
    [alerting]
    enabled = true
    execute_alerts = true</span>
</code></pre> 
<p>上面配置了我的 163 邮箱，开启报警功能，当然我们还得将这个 ConfigMap 文件挂载到 Pod 中去：</p> 
<pre><code class="prism language-yaml">  <span class="token key atrule">volumeMounts</span><span class="token punctuation">:</span>
  <span class="token punctuation">-</span> <span class="token key atrule">mountPath</span><span class="token punctuation">:</span> <span class="token string">"/etc/grafana"</span>
    <span class="token key atrule">name</span><span class="token punctuation">:</span> config
<span class="token key atrule">volumes</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> config
  <span class="token key atrule">configMap</span><span class="token punctuation">:</span>
    <span class="token key atrule">name</span><span class="token punctuation">:</span> grafana<span class="token punctuation">-</span>config
</code></pre> 
<p>创建 ConfigMap 对象，更新 Deployment：</p> 
<pre><code class="prism language-shell">$ kubectl create <span class="token parameter variable">-f</span> grafana-cm.yaml
$ kubectl apply <span class="token parameter variable">-f</span> grafana-deploy.yaml
</code></pre> 
<p>更新完成后，在 grafana 的 webui 中<code>Alert</code>页面测试邮件报警：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/ab7457206b990c673a190150a936ac22.png" alt="grafana email alert"></p> 
<p>发送测试后，正常情况下就可以收到测试报警邮件</p> 
<p>到这里就完成了使用 grafana 来展示 Kubernetes 集群的监控图表信息以及报警配置，但是我们明显可以感觉到 grafana 的优势在于图表的展示，报警功能有点弱，所以一般来说，在生产环境我们不会直接使用 grafana 的报警功能，更多的是使用功能更加强大的 AlertManager。</p>
                </div>
            </body>
            </html>
            